﻿#ifndef QGLOBALSTATUS_H
#define QGLOBALSTATUS_H

/***************************************
 * 【文件说明】 QT程序全局单例状态类
 * 【使用方法】：
    // 获取配置管理器实例
    QGlobalStatus* status = QGlobalConfig::instance();

    // 读取状态
    QString someStatus = config->value("someStatus", "defaultValue");
    qDebug() << "someStatus:" << someStatus.toString();

    // 写入状态
    config->setValue("someStatus", "statusValue");
    qDebug() << "Updated someStatus to:" << config->value("someKey").toString();

    // 移除某个状态
    config->remove("someKey");

    // 清空所有状态
    config->clear();
***************************************/

#include <QObject>
#include <QMap>
#include <QString>
#include <QVariant>
#include <QMutex>
#include <cstdint> // 用于固定宽度的整数类型
#include <QList>
#include <QVector>
#include <QSet>

class QGlobalStatus : public QObject
{
    Q_OBJECT

public:
    // 获取单例实例
    static QGlobalStatus* instance();

    // 基本类型设置与获取
    void setStatus(const QString &key, int8_t value);
    int8_t getStatus(const QString &key, int8_t defaultValue = 0) const;

    void setStatus(const QString &key, int16_t value);
    int16_t getStatus(const QString &key, int16_t defaultValue = 0) const;

    void setStatus(const QString &key, int32_t value);
    int32_t getStatus(const QString &key, int32_t defaultValue = 0) const;

    void setStatus(const QString &key, int64_t value);
    int64_t getStatus(const QString &key, int64_t defaultValue = 0) const;

    void setStatus(const QString &key, uint8_t value);
    uint8_t getStatus(const QString &key, uint8_t defaultValue = 0) const;

    void setStatus(const QString &key, uint16_t value);
    uint16_t getStatus(const QString &key, uint16_t defaultValue = 0) const;

    void setStatus(const QString &key, uint32_t value);
    uint32_t getStatus(const QString &key, uint32_t defaultValue = 0) const;

    void setStatus(const QString &key, uint64_t value);
    uint64_t getStatus(const QString &key, uint64_t defaultValue = 0) const;

    void setStatus(const QString &key, float value);
    float getStatus(const QString &key, float defaultValue = 0.0f) const;

    void setStatus(const QString &key, double value);
    double getStatus(const QString &key, double defaultValue = 0.0) const;

    void setStatus(const QString &key, const std::string &value);
    std::string getStatus(const QString &key, const std::string &defaultValue = "") const;

    void setStatus(const QString &key, const QString &value);
    QString getStatus(const QString &key, const QString &defaultValue = "") const;

    // 容器类型设置与获取
    template<typename T>
    void setStatus(const QString &key, const QList<T> &value);

    template<typename T>
    QList<T> getStatus(const QString &key, const QList<T> &defaultValue = {}) const;

    template<typename T>
    void setStatus(const QString &key, const QVector<T> &value);

    template<typename T>
    QVector<T> getStatus(const QString &key, const QVector<T> &defaultValue = {}) const;

    template<typename T>
    void setStatus(const QString &key, const QSet<T> &value);

    template<typename T>
    QSet<T> getStatus(const QString &key, const QSet<T> &defaultValue = {}) const;

    //删除
    void remove(const QString &key);

    //清空
    void clear();
private:
    // 构造函数私有化
    QGlobalStatus();
    ~QGlobalStatus();

    // 禁止拷贝构造和赋值操作
    QGlobalStatus(const QGlobalStatus&) = delete;
    QGlobalStatus& operator=(const QGlobalStatus&) = delete;

    // 存储状态信息的映射
    QMap<QString, QVariant> m_statusMap;

    // 互斥锁，保证线程安全
    mutable QMutex m_mutex;
};

#endif // QGLOBALSTATUS_H
